module about_ctfe;

import dunit;
import helpers;

/* CTFE stands for Compile Time Function Execution;
 * D compiler is able to execute code at compile time
 */

size_t counter;

int sum(int x, int y) {
  return x + y;
}

int factorial(int x) { // a classic
  int result = 1;
  for (auto i = 2; i <= x; i++) {
    result = result * i;
  }
  if (!__ctfe) {
    // This code is for execution at run time
    ++counter;
  }
  return result;
}


class AboutCTFE {
  mixin UnitTest;

  @Test
  public void simple_CTFE() {
    auto a = 1 + 2;  // this expression is evaluated by the compiler (like in C)
    enum b = sum(3, 4);  // but also this. What's the difference ?
    assertEquals(a, FILL_IN_THIS_NUMBER);
    assertEquals(b, FILL_IN_THIS_NUMBER);
  }


  @Test
  public void advanced_CTFE() {
    auto x = factorial(2);
    enum y = factorial(3);
    assertEquals(x + y, FILL_IN_THIS_NUMBER);
    assertEquals(counter, FILL_IN_THIS_NUMBER);
  }
}